﻿
// Space Elevator POJ - 2392.cpp : 此文件包含 "main" 函数。程序执行将在此处开始并结束。
//

#include <iostream>
#include <algorithm>


using namespace std;
//https://vjudge.csgrandeur.cn/problem/POJ-2392

/*
奶牛们要去太空了！它们计划通过搭建一种太空电梯：
一座巨大的积木塔来进入轨道。它们有 K (1 <= K <= 400) 种不同类型的积木来建造这座塔。
第 i 种积木的高度为 h_i (1 <= h_i <= 100)，数量为 c_i (1 <= c_i <= 10)。
由于宇宙射线可能会造成损坏，第 i 类区块的任何部分都不能超过最大高度 a_i (1 <= a_i <= 40000)。

按照规则将积木堆叠在一起，帮助奶牛建造最高的太空电梯。
输入
* 第 1 行： 一个整数 K
* 第 2...K+1 行：每行包含三个空格分隔的整数：h_i、a_i 和 c_i。第 i+1 行描述区块类型 i。
* 
输出
* 第 1 行： 一个整数 H，即可建塔的最大高度
样本
3
7 40 3
5 23 8
2 52 6

48
提示
输出详情：
从底部开始： 3 个 2 型图块，下面是 3 个 1 型图块，下面是 6 个 3 型图块。堆叠 4 个类型 2 的图块和 3 个类型 1 的图块是不合法的，
因为最后一个类型 1 的图块的顶部会超过高度 40。
*/


const int N = 410;
struct BLOCK {
	int hight, cnt, limit;
}blocks[N];
int n;

int dp[N][40010];


bool cmp(const struct BLOCK& a, const struct BLOCK& b) {
	return a.limit < b.limit;
}


void solve() {
	dp[0][0] = 1;
	int ans = 0;
	for (int i = 1; i <= n; i++) {
		int du1 = 0;
		for (int j = 0; j <= 40000; j++) {
			int duan = 0;
			dp[i][j] = dp[i - 1][j];
			for (int k = 1; k <= blocks[i].cnt; k++) {
				if(j <= blocks[i].limit && j >= k*blocks[i].hight)
					dp[i][j] |= dp[i - 1][j - k * blocks[i].hight];
			}
			if (dp[i][j] == 1) {
				ans = max(ans, j);
			}
		}
	}

	cout << ans << endl;
}

int main()
{
	cin >> n;
	for (int i = 1; i <= n; i++) {
		cin >> blocks[i].hight >> blocks[i].limit >> blocks[i].cnt;
	}
	sort(blocks+1,blocks+n+1,cmp);

	solve();

	return 0;
}

 